home *** CD-ROM | disk | FTP | other *** search
- /*
- ==============================================================================
- WordUp Graphics Toolkit Version 5.0
- Demonstration Program 61
-
- This program demonstrates use of the sprite library to create a simple
- SPACE INVADERS game. Mouse movement is used to control the user's ship,
- and the aliens will follow a predetermined pattern. Alien fire will not
- damage your ship. This game is incomplete.
-
- *** PROJECT ***
- This program requires the WGT5_WC.LIB and WSPR_WC.LIB files to be linked.
-
- *** DATA FILES ***
- INVADE.PAK, INVADER.SPR
- WATCOM C++ VERSION
- ==============================================================================
- */
-
- #include <stdlib.h>
- #include <conio.h>
- #include <dos.h>
- #include <ctype.h>
- #include <wgt5.h>
- #include <wgtspr.h>
-
- block title;
-
- color palette[256];
- block sprites[1001];
- short x,y,i;
- char k;
- char ch;
- short killed;
- short totshoot;
- short temp;
-
- // sprites numbers (So you don't get confused)
- // 1 = spaceship
- // 2 = missile fired
- // 3-24 = aliens!
- // 25-39= aliens missiles
-
- void gameloop (void);
-
-
- int timer;
-
- void timer_routine (void)
- {
- timer++;
- }
-
-
- void main(void)
- {
- if (!vgadetected ())
- {
- printf ("VGA is required to run this program...");
- exit (1);
- }
-
-
- printf ("WGT Example #61\n\n");
- printf ("This program demonstrates use of the sprite library to create a simple\n");
- printf ("SPACE INVADERS game. Mouse movement is used to control the user's ship,\n");
- printf ("and the aliens will follow a predetermined pattern. Alien fire will not\n");
- printf ("damage your ship. This game is incomplete.\n");
- printf ("Press q during the game to quit.\n");
-
- i = minit ();
- if (i == 0)
- {
- printf ("Mouse not detected. You need a mouse for this example program\n");
- exit (1);
- }
- else printf ("Mouse with %i buttons detected.\n", i);
-
- printf ("\nPress any key to begin.\n");
- getch ();
-
- vga256 ();
- title = wloadpak ("invade.pak");
- wloadsprites (palette, "invader.spr", sprites, 0, 100);
- wsetpalette (0, 255, palette);
-
- winittimer ();
- wstarttimer (timer_routine, TICKS(60));
-
- do {
- killed = 0;
- wclip (0, 0, 319, 199);
- maxsprite = 39; /* thirty nine sprites on now */
- initialize_sprites (sprites);
-
- wsetscreen (spritescreen);
-
- wputblock (0, 0, title, 0);
- wsetcolor (0);
- wbar(0, 0, 319, 140);
- wnormscreen ();
- wcopyscreen(0, 0, 319, 199, spritescreen, 0, 0, NULL);
- wcopyscreen(0, 0, 319, 199, spritescreen, 0, 0, backgroundscreen);
-
- spriteon(0, 160, 148, 1);
-
- for (y = 0; y < 3; y++)
- for (x = 1; x < 8; x++)
- {
- temp = (y * 7) + x + 1;
- spriteon(temp, x * 20 + 10, 20 + y * 30, 3); /* turn alien on */
- animate(temp, "(3,3)(4,3)(5,3)(4,3)R"); /* animate it */
- animon (temp);
- movex (temp, "(1,150,0)(0,30,0)(-1,150,0)(0,30,0)R");
- /* set up x movement */
-
- movey (temp, "(0,150,0)(1,30,0)(0,150,0)(-1,30,0)R");
- /* set up y movement */
- movexon (temp);
- moveyon (temp);
- }
-
- msetbounds(0, 148, 319, 148);
- msetxy (160, 148);
-
- timer = 0;
-
- for (x = 1; x < 15; x++)
- spriteoff (x + 22);
-
- totshoot = 0;
-
-
- do { /* Play game until keypress */
- gameloop ();
- } while ((!kbhit ()) && (killed < 21));
-
- if (killed != 21)
- ch = toupper (getch ());
- killed = 0;
- msetbounds (0, 0, 319, 199);
-
- deinitialize_sprites (); /* Deinit the sprite system */
- } while (ch != 'Q'); /* Restart game if not Q */
-
- wstoptimer ();
- wdonetimer ();
-
- mdeinit ();
- wsetmode (3);
- }
-
-
-
- void gameloop (void)
- {
- short checkspr;
- int movement_multiplier;
- int count;
- int openslot;
-
- //wretrace (); /* Time updates to vertical retrace */
- erase_sprites ();
-
- count = movement_multiplier = timer;
- timer = 0;
-
-
- while (count > 0)
- {
- s[0].x = mouse.mx; /* Set player position */
- s[0].y = mouse.my;
-
- if ((mouse.but == 1) && (s[1].on == 0)) /* not shooting then */
- {
- sound (600);
- spriteon (1, s[0].x + 3, s[0].y, 2);/* turn on the missile sprite */
- movey (1, "(-2,200,0)"); /* make it move up */
- moveyon (1); /* turn the movement on */
- }
-
- for (y = 0; y < 3; y++) /* loop through all aliens */
- for (x = 1; x < 8; x++)
- {
- checkspr = (y * 7) + x + 1;
- if (s[checkspr].on == 1) /* if the sprite is still onscreen */
- {
- /* Do not shoot more than 14 at once since we can only have
- sprites */
- if ((rand () % 50 == 5) && (totshoot < 13))
- /* 1 in 50 chance of shooting */
- {
- openslot = -100;
- i = 1;
- do
- {
- if (s[i + 22].on == 0) /* find an open slot for missile */
- {
- openslot = i;
- i = 16;
- }
- i++;
- } while (i < 15);
-
- if (openslot != -100)
- {
- totshoot++;
- spriteon (openslot + 22, s[checkspr].x + 4,
- s[checkspr].y, 2); /* turn shot on */
- movey (openslot + 22, "(1,160,0)"); /* move it down */
- moveyon (openslot + 22);
- }
- }
-
- if ((overlap (1, checkspr) == 1) && (s[checkspr].num <6))
- /* if your missile is hitting it and it isn't already exploding */
- {
- sound (200);
- spriteoff (1); /* turn off the missile */
- animate (checkspr, "(6,5)(7,5)(8,5)(9,5)(10,5)");
- /* show explosion */
- animon (checkspr); /* reset animation */
- }
- if (s[checkspr].num == 10) /* if finished animating, */
- {
- spriteoff (checkspr); /* turn off the sprite */
- killed++;
- }
- }
- }
-
- for (y = 1; y < 15; y++) /* Disable missles when they hit ground */
- {
- if ((s[y + 22].on == 1) && (s[y + 22].y > 154))
- {
- spriteoff (y + 22);
- totshoot--;
- }
- }
-
- if (s[1].y < -10) /* User missle off screen? */
- spriteoff (1);
- count--;
- }
-
- draw_sprites (movement_multiplier);
- /* Draw the sprites again */
-
- nosound (); /* Stop all sounds */
- }
-
-